Skip to content

[feature](nereids) Support SEARCH in joins and per-field analyzers - #67932

Draft
eldenmoon wants to merge 4 commits into
apache:masterfrom
eldenmoon:branch-search-join-master-pr
Draft

eldenmoon wants to merge 4 commits into
apache:masterfrom
eldenmoon:branch-search-join-master-pr

Conversation

@eldenmoon

Copy link
Copy Markdown
Member

What problem does this PR solve?

SEARCH in WHERE is rejected when its input contains an OLAP join. Residual predicates such as (MATCH AND EXISTS (...)) OR joined_column = ... can also reach execution without an inverted-index evaluation path. Filtering the scan by MATCH alone would incorrectly remove rows selected by the other OR branch.

This PR binds SEARCH field dependencies before pruning and predicate movement, and extends the existing scan virtual-column rule to materialize MATCH/SEARCH booleans used by projections, residual filters, and join conditions. The original SQL boolean expression and join multiplicity are preserved. This includes WHERE predicates moved into INNER JOIN conditions by the optimizer.

It also supports per-field analyzer selection, for example search('name@exact:"John Smith" AND title@text:software'), including selectors in the fields option. Selected index properties use the existing FE/BE interface. Quoted literal @ field names remain supported.

Each SEARCH expression still references one table instance; separate SEARCH expressions can be combined across tables using SQL AND/OR. SEARCH across an outer join's null-generating side remains conservatively gated. Explicit SEARCH projections/ON clauses, tuple IN subqueries, analyzer-IN, and multiple analyzers for the same field within one SEARCH are outside this change.

No BE code, storage format, Thrift, or new plan-node changes are included. Typed VARIANT TopN uses existing lazy materialization; sorting an untyped VARIANT value still requires an explicit cast.

Release note

Support SEARCH predicates in OLAP join queries and per-field analyzer selection, and evaluate residual MATCH/SEARCH expressions through indexed scan virtual columns.

Check List (For Author)

  • Test
    • Regression test
    • Unit Test
    • Manual test (details below)
    • No need to test or manual test.

Validation on the original development baseline 16ab0566e9796d0498e6d2b3221e2a59d5e94ef7 with these changes:

  • ASAN BE/FE build and FE Checkstyle passed.
  • A 250-test FE matrix passed; a subsequent focused 15-test run passed after adding INNER JOIN-condition handling (the runs overlap).
  • Seven regression suites passed in normal comparison mode: test_crm_search_join_document, test_crm_search_analyzers, test_crm_search_variant_topn, test_search_usage_restrictions, test_search_null_semantics, test_search_variant_subcolumn_analyzer, and test_match_projection_virtual_column.
  • Generated expectations cover the CRM query examples, duplicate/NULL/unmatched join rows, MOW updates, analyzer differences, and unsupported syntax. Non-equivalent query variants have separate expected results.
  • Typed TopN with and without lazy materialization returned the same 100 ordered rows and payloads; EXPLAIN confirmed MaterializeNode. These are correctness checks, not performance measurements.
  • Disabling the virtual-column rule with MATCH fallback disabled reproduced match_any not support execute_match for the OR/EXISTS control query; enabling it returned the expected five rows.

For this PR, only the two feature/test commits were cherry-picked onto master df36e174b99557a004bc3ad57faa019da4a7d91f. Range comparison shows unchanged test changes and only surrounding Analyzer context differences. Tests have not been rerun on this rebased master head; the draft records that validation boundary explicitly. No C++ files changed, so clang-format is not applicable.

  • Behavior changed:

    • No.
    • Yes. SEARCH is accepted in supported OLAP JOIN WHERE contexts; per-field analyzer selectors are recognized.
  • Does this need documentation?

    • No.
    • Yes. Follow-up documentation should describe analyzer selectors and supported SEARCH/JOIN placements.

Check List (For Reviewer who merge this PR)

  • Confirm the release note
  • Confirm test cases
  • Confirm document
  • Add branch pick label

@hello-stephen

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@eldenmoon

Copy link
Copy Markdown
Member Author

run buildall

1 similar comment
@eldenmoon

Copy link
Copy Markdown
Member Author

run buildall

@eldenmoon

Copy link
Copy Markdown
Member Author

/review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Static review at exact head 3606a1a2af1b2a3632f0c6d57e89e44959f55205. I found six distinct issues: three can return wrong results or query the wrong index (selector collision, outer-join SEARCH(NULL), and analyzer-selected EXACT), one newly rejects a valid passthrough alias, one rejects equivalent analyzer spellings, and one evaluates the same MATCH virtual expression twice.

Checkpoint conclusions: the change is focused on the necessary analyzer, rewrite, expression, and translation stages, and the changed tests broadly cover direct/VARIANT OLAP joins, MOW behavior, TERM/PHRASE analyzers, and typed VARIANT TopN. They do not cover the six inline triggers. No new shared-state concurrency, lifecycle/static initialization, configuration, persistence/EditLog, transaction/write, or storage-format mechanism is introduced. Existing field-binding/index-properties transport remains positionally aligned for ordinary and VARIANT slots, but it cannot preserve explicit-selector intent for EXACT as implemented. Join types, ExprIds/nullability, predicate movement, top-down reentry, direct/residual paths, options fields, generated outputs, ordering, and negative-test form were checked; the duplicate virtual MATCH is the only additional performance issue. Existing diagnostics are otherwise sufficient.

This was a static-only review as required: I did not run builds or tests. The author reports validation on an older development baseline, and current exact-head CI is separate from that claim. There was no additional user focus and no existing inline review thread to duplicate.

while (analyzerSeparator > 0 && bindingName.charAt(analyzerSeparator - 1) == '\\') {
analyzerSeparator = bindingName.lastIndexOf('@', analyzerSeparator - 1);
}
if (analyzerSeparator >= 0 && findSlotByName(bindingName, scan) == null) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] Preserve analyzer-selector syntax before schema lookup. For an unquoted name@english the parser leaves @ unescaped, but this branch treats it as a selector only when a slot named name@english does not exist. If a table has both indexed name and a literal name@english column, the query silently binds the literal column and its index instead of applying the english analyzer to name, so it can return different rows. Please carry quoted/unquoted provenance through parsing and split every unquoted selector independently of slot collisions, with a collision regression.

}
String fieldKey = normalizedFieldName.toLowerCase(Locale.ROOT);
if (fieldAnalyzers.containsKey(fieldKey)
&& !Objects.equals(fieldAnalyzers.get(fieldKey), binding.getAnalyzerName())) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Compare analyzer identities with the same normalization used for index lookup. isAnalyzerMatched accepts analyzer names case-insensitively, so both name@CRM_DOC_TEXT and name@crm_doc_text resolve to the same index, but this Objects.equals check then rejects them as two analyzers for one field. Normalize with Locale.ROOT (or compare case-insensitively) and cover mixed-case spellings in one DSL.

originalFieldName, search.getDslString()));
}
checkInvertedIndexExists(scan.getTable(), slot.getName(), search.getDslString(), false);
checkInvertedIndexExists(tableForSlot(slot, scan), slot.getName(), search.getDslString(), false);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] Check the physical original column rather than the visible alias. For a passthrough such as (SELECT content AS body FROM t) s, findSlotByName returns body and that slot retains originalTable=t/originalColumn=content, but this call asks t for a column named body and falsely reports that no index exists. The VARIANT parent path has the same alias issue. Please use the slot's original column (plus subpath where applicable) for index validation while retaining the alias only for DSL binding, and add renamed-output regressions.

for (Expression child : children) {
if (!(child instanceof SlotReference || child instanceof ElementAt)) {
if (!(child instanceof SlotReference || child instanceof ElementAt
|| child instanceof NullLiteral)) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] Do not let inference-only NULL children persist into executable SEARCH plans. For a LEFT JOIN b ON FALSE with search('content:john') IS NULL on b, join elimination produces NULL AS content and filter-through-project substitutes it here, yielding Search(NULL) directly over a's scan. The materializer skips it, the final Filter-to-scan check admits it, and BE's no-iterator path produces empty data and null bitmaps, so SEARCH is false/non-null and the preserved rows are wrongly rejected. Please keep symbolic NULL replacement non-persistent or reject non-slot/subcolumn children before translation, and cover false outer-join padding.

return null;
}
List<NamedExpression> projects = new ArrayList<>(project.getProjects());
projects.add(result.second);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Record or reuse the materialization before leaving this project. If the same MATCH appears in this child projection and a preserved-side outer-join ON condition, pushDownJoin first reaches this path and appends one virtual slot; top-down traversal then reaches the rebuilt project, where the direct Project-to-scan rule allocates a second alias because it does not consult the scan's existing virtual columns. Both ExprIds stay referenced and the segment iterator evaluates/materializes the predicate twice. Please centralize the reuse check and assert this plan has one virtual MATCH column.

Column column = slot.getOriginalColumn().orElse(null);
if (column != null) {
invertedIndex = olapTbl.getInvertedIndex(column, slot.getSubPath());
invertedIndex = olapTbl.getInvertedIndex(column, slot.getSubPath(), analyzer);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] Ensure this selected analyzer also constrains BE reader choice for EXACT. FE resolves the requested index here and sends its properties, but FieldReaderResolver derives analyzer_key only when the query type is not EQUAL_QUERY; SEARCH maps EXACT to EQUAL_QUERY. Two custom standard/keyword analyzers are both FULLTEXT readers, so the empty-key selector can pick the lower index ID instead of the requested keyword analyzer and return different rows. Please honor an explicit analyzer for every clause type (then apply type preference within that analyzer) and add a two-analyzer EXACT regression.

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 74.71% (127/170) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 16789 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 3606a1a2af1b2a3632f0c6d57e89e44959f55205, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17572	3026	3030	3026
q2	2089	251	226	226
q3	10243	858	515	515
q4	4672	260	211	211
q5	7658	544	395	395
q6	140	113	94	94
q7	517	495	385	385
q8	9240	951	960	951
q9	3468	2390	2349	2349
q10	6512	879	723	723
q11	394	209	177	177
q12	615	258	197	197
q13	18123	1524	1160	1160
q14	155	150	143	143
q15	q16	430	398	375	375
q17	1339	860	882	860
q18	3114	2243	2240	2240
q19	1266	921	758	758
q20	372	280	202	202
q21	5600	1573	1811	1573
q22	314	266	229	229
Total cold run time: 93833 ms
Total hot run time: 16789 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	3416	3328	3283	3283
q2	531	396	370	370
q3	2177	2417	2219	2219
q4	1175	1164	898	898
q5	2179	2111	2111	2111
q6	171	117	87	87
q7	1054	921	845	845
q8	1583	1377	1389	1377
q9	3131	3075	3090	3075
q10	1875	1795	1636	1636
q11	357	271	244	244
q12	454	428	339	339
q13	1474	1535	1164	1164
q14	181	178	152	152
q15	q16	395	393	357	357
q17	3631	3333	3233	3233
q18	4818	4406	4706	4406
q19	860	806	920	806
q20	1008	962	821	821
q21	3821	3137	3325	3137
q22	402	353	331	331
Total cold run time: 34693 ms
Total hot run time: 30891 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 81601 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 3606a1a2af1b2a3632f0c6d57e89e44959f55205, data reload: false

query5	4267	417	336	336
query6	382	142	129	129
query7	4925	439	228	228
query8	296	131	124	124
query9	8705	2917	2873	2873
query10	403	219	184	184
query11	5395	1039	927	927
query12	120	71	74	71
query13	1208	446	326	326
query14	5975	2203	2089	2089
query14_1	1997	1960	1959	1959
query15	177	125	111	111
query16	921	379	368	368
query17	849	452	349	349
query18	2332	330	245	245
query19	166	141	112	112
query20	86	71	68	68
query21	202	102	88	88
query22	5510	5275	5266	5266
query23	6800	6257	6038	6038
query23_1	6165	6049	6140	6049
query24	7281	1099	775	775
query24_1	770	787	772	772
query25	449	287	224	224
query26	1231	230	127	127
query27	2782	408	258	258
query28	4668	1502	1480	1480
query29	887	411	325	325
query30	245	151	131	131
query31	798	397	326	326
query32	126	71	73	71
query33	437	203	174	174
query34	975	833	479	479
query35	386	388	336	336
query36	572	565	563	563
query37	125	83	68	68
query38	993	836	797	797
query39	487	487	465	465
query39_1	458	468	460	460
query40	197	87	73	73
query41	54	52	52	52
query42	73	72	72	72
query43	236	244	209	209
query44	997	529	530	529
query45	110	104	99	99
query46	797	838	554	554
query47	777	778	732	732
query48	290	283	227	227
query49	538	243	182	182
query50	751	256	186	186
query51	8202	8047	8099	8047
query52	69	72	64	64
query53	196	190	146	146
query54	203	168	147	147
query55	73	61	52	52
query56	210	188	150	150
query57	829	659	658	658
query58	197	181	159	159
query59	1203	1220	1102	1102
query60	232	183	171	171
query61	113	126	136	126
query62	341	204	171	171
query63	171	144	147	144
query64	2772	671	617	617
query65	1620	1650	1546	1546
query66	1809	267	191	191
query67	9816	9792	9644	9644
query68	2998	1154	754	754
query69	343	207	203	203
query70	657	620	615	615
query71	247	176	153	153
query72	2249	1671	1461	1461
query73	676	586	330	330
query74	2009	1224	1126	1126
query75	1180	1096	963	963
query76	2368	698	545	545
query77	252	258	200	200
query78	3972	3775	3184	3184
query79	1232	794	566	566
query80	1331	317	264	264
query81	462	152	138	138
query82	583	122	92	92
query83	282	213	188	188
query84	267	108	89	89
query85	1062	326	275	275
query86	352	179	162	162
query87	1037	976	895	895
query88	2769	2092	2104	2092
query89	282	197	175	175
query90	1781	120	127	120
query91	126	119	96	96
query92	74	69	71	69
query93	1113	1124	687	687
query94	552	252	211	211
query95	521	324	227	227
query96	760	531	295	295
query97	1073	1034	1001	1001
query98	140	131	134	131
query99	419	337	305	305
Total cold run time: 176041 ms
Total hot run time: 81601 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 14.85 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 3606a1a2af1b2a3632f0c6d57e89e44959f55205, data reload: false

query1	0.01	0.00	0.01
query2	0.08	0.04	0.04
query3	0.25	0.12	0.11
query4	1.60	0.09	0.10
query5	0.17	0.16	0.15
query6	1.29	0.71	0.69
query7	0.03	0.01	0.00
query8	0.05	0.03	0.02
query9	0.30	0.21	0.21
query10	0.37	0.35	0.33
query11	0.17	0.12	0.11
query12	0.17	0.12	0.12
query13	0.31	0.31	0.30
query14	0.45	0.46	0.45
query15	0.36	0.35	0.36
query16	0.24	0.20	0.23
query17	0.68	0.70	0.68
query18	0.18	0.17	0.17
query19	1.17	1.20	1.16
query20	0.02	0.00	0.00
query21	15.43	0.15	0.11
query22	5.06	0.04	0.04
query23	16.17	0.25	0.11
query24	3.06	0.30	0.25
query25	0.10	0.06	0.06
query26	0.74	0.15	0.12
query27	0.05	0.03	0.02
query28	3.69	0.56	0.29
query29	12.44	3.18	2.54
query30	0.25	0.13	0.14
query31	2.75	0.36	0.17
query32	3.53	0.31	0.23
query33	1.41	1.59	1.55
query34	15.41	2.19	1.81
query35	1.75	1.75	1.78
query36	0.45	0.32	0.28
query37	0.07	0.04	0.04
query38	0.04	0.02	0.02
query39	0.03	0.03	0.02
query40	0.11	0.07	0.08
query41	0.07	0.03	0.02
query42	0.03	0.02	0.02
query43	0.03	0.02	0.02
Total cold run time: 90.57 s
Total hot run time: 14.85 s

eldenmoon and others added 2 commits September 17, 2026 22:34
…e an outer join's NULL side

### What problem does this PR solve?

Issue Number: None

Related PR: apache#67932

Problem Summary: PushDownProject pushes every PreferPushDownProject expression (MATCH, element_at, ...) used by a
filter or project above a join into the child that outputs its slots. When that child is the NULL-extended side of an
outer join, the join pads the pushed value with NULL, but the same expression evaluated above the join can be non-NULL
for NULL input. Reproduce with

    SELECT b.k1 FROM b LEFT JOIN a ON b.k1 = a.k1 WHERE nvl(a.content, 'hello') MATCH_ANY 'hello' OR b.k1 = 100

Rows of b without a join partner satisfy the predicate (nvl(NULL, 'hello') matches), yet they were dropped because the
MATCH was computed inside a and then padded with NULL. The same happened to such an expression in the SELECT list,
which returned NULL instead of TRUE.

The fix adds ExpressionUtils.isNullPropagating, built on the existing replace-slots-with-NULL-and-fold inference
(matchesWhenSlotsAreNull, generalized from a single slot), and PushDownProject only pushes an expression into a
NULL-extended join child when it is NULL for NULL input. The scan virtual column rule of the related PR uses the same
helper. SearchExpression is excluded from BE constant folding like Search, because that inference replaces its slots
with NULL literals.

### Release note

Fix wrong results when a MATCH (or another pushed-down expression) whose operand turns NULL into a value, such as
nvl(col, 'x') MATCH_ANY 'x', is evaluated over the NULL-extended side of an outer join.

### Check List (For Author)

- Test: Unit Test (PushDownProjectTest, ExpressionUtilsTest) and Regression test
  (search/test_crm_search_join_document: nullside_nonstrict_match_where, nullside_nonstrict_match_select)
- Behavior changed: No
- Does this need documentation: No

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d execution checks

### What problem does this PR solve?

Issue Number: None

Related PR: apache#67932

Problem Summary: Review of SEARCH in joins found correctness and maintainability problems that share a few causes:
several places decided the same thing differently, and checks looked at plan shapes instead of what BE executes.

Correctness

1. NULL padding could bypass the outer join guard. `LEFT JOIN a ON false`, an outer join converted to an anti join,
   and alias inlining of `NULL AS col` replace a SEARCH field with a NULL literal; the expression then sat on the
   preserved scan where BE found no indexed field and evaluated it as FALSE, so `NOT search(...) OR b.k1 = 8` returned
   every row. CheckAfterRewrite now verifies, in one place and also for scan virtual columns, that every
   SearchExpression is evaluated by a scan and still binds only index fields.
2. Predicate inference copied a SEARCH to an equal column. With `a JOIN n ON a.content = n.name WHERE
   search('a.content:hello') OR a.content = 'zzz'`, InferPredicateByReplace produced `search[n.name] OR n.name = 'zzz'`
   for n, whose column has no inverted index, and the query returned no rows instead of four. The positional
   inference of INTERSECT/EXCEPT in InferPredicates rebinds a pulled-up SEARCH the same way (an INTERSECT with a
   SEARCH branch returned no rows). A SEARCH is bound to the indexes of its own columns, so it is neither an input
   of equality inference nor cloned into a sibling branch, like volatile expressions.
3. `field@analyzer` was read as a column named `field@analyzer` whenever such a column existed. The selector is now
   purely syntactic and owned by SearchDslParser.splitAnalyzerSelector: the last unescaped `@` after a non-empty path
   segment selects the analyzer; `\@`, an `@` inside a quoted segment and an `@` that starts a segment
   (`v.@timestamp`) belong to the name.
4. Index validation and the field names sent to BE used the slot's output name. After `SELECT content AS body` or
   `v AS props` a valid SEARCH failed with "Column not found", or validated another column that happened to carry the
   alias name. Names are resolved by their visible name; validation, NESTED paths and BE field names use the slot's
   original table and column.

Generality and maintainability

5. One materialization path. Project over a scan only unwrapped `Alias(match)` while residual filters and joins
   collected searches recursively, so `CASE WHEN col MATCH ... END` behaved differently by plan shape. The rule
   (renamed PushDownIndexSearchAsVirtualColumn; the rule type keeps its name for disable_nereids_rules) has a single
   collect, materialize, replace path, no longer appends a reused virtual column twice, and refuses to inline a
   volatile alias producer.
6. Responsibilities are explicit: CheckSearchUsage checks placement on the analyzed plan (a necessary condition
   only), materialize() alone decides where an index search may be computed, CheckAfterRewrite verifies the final
   plan. The qualifier-set "one table" check is gone; a SEARCH over two relations can never reach one scan and is
   rejected by the final check with the constraints spelled out.
7. Field names resolve like SQL column references by reusing ExpressionAnalyzer.bindSlotByScope, so `alias.field`
   selects one side of a self join before `column.subcolumn` is tried, and an ambiguous name is an error.
8. "One analyzer per field" compares the inverted indexes selected by OlapTable.getInvertedIndex, the lookup the
   translator sends to BE, instead of analyzer strings, so `name@Exact` and `name@exact` agree. Variant subcolumn
   paths keep their case when the plan fields are normalized.
9. Messages and comments no longer say "single-table scans"; the dead Rewriter registration of RewriteSearchToSlots
   is removed because binding happens in the Analyzer.

Tests

The pipeline randomizes the VARIANT defaults. With a small default_variant_max_subcolumns_count a subcolumn is stored
in the sparse column without an inverted index, which made test_crm_search_join_document fail with "match_all not
support execute_match" and test_crm_search_analyzers return an empty result (both reproduced by setting the variable
by hand). The three CRM suites now pin those defaults like the other search suites.

### Release note

In a SEARCH field reference an unquoted `@` always selects an analyzer; quote the segment or write `\@` for a literal
`@` that follows a field name. SEARCH fields may be qualified with a table alias (`search('a.title:x')`).

### Check List (For Author)

- Test: Unit Test (SearchJoinDocumentTest, RewriteSearchToSlotsTest, PushDownIndexSearchAsVirtualColumnTest,
  SearchDslParserTest, SearchExpressionTest, CheckSearchUsageTest and the FE tests that reference the changed rules)
  and Regression test (search/, inverted_index_p0/test_match_projection_virtual_column)
- Behavior changed: Yes (see release note; error messages for unsupported SEARCH placement are more specific)
- Does this need documentation: Yes (analyzer selector and table alias syntax of SEARCH fields)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@eldenmoon

Copy link
Copy Markdown
Member Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 27992 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 7b9071b2fb424504e028aace739e53df733cf31d, data reload: false

------ Round 1 ----------------------------------
============================================
q1	18092	3906	3819	3819
q2	2258	346	303	303
q3	10029	1382	796	796
q4	4684	489	346	346
q5	7490	814	555	555
q6	180	163	135	135
q7	752	807	582	582
q8	9345	1551	1578	1551
q9	5421	4200	4216	4200
q10	6765	1621	1361	1361
q11	443	269	239	239
q12	629	406	290	290
q13	18042	2636	2021	2021
q14	251	261	236	236
q15	q16	726	722	661	661
q17	1755	1179	1050	1050
q18	6514	5628	5564	5564
q19	1165	1267	1063	1063
q20	476	376	256	256
q21	5227	2916	2650	2650
q22	459	372	314	314
Total cold run time: 100703 ms
Total hot run time: 27992 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4573	4696	4399	4399
q2	824	625	570	570
q3	4878	5323	4687	4687
q4	2235	2352	1469	1469
q5	4550	4408	4542	4408
q6	238	180	128	128
q7	1838	1662	1457	1457
q8	2355	2032	2005	2005
q9	7279	7249	7192	7192
q10	4301	4177	3811	3811
q11	514	370	340	340
q12	698	714	500	500
q13	2315	2598	1993	1993
q14	273	265	244	244
q15	q16	717	679	597	597
q17	7268	6664	6636	6636
q18	11879	11073	11776	11073
q19	1074	992	987	987
q20	2189	2177	1894	1894
q21	5353	4429	4553	4429
q22	502	444	402	402
Total cold run time: 65853 ms
Total hot run time: 59221 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 153333 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 7b9071b2fb424504e028aace739e53df733cf31d, data reload: false

query5	4325	600	453	453
query6	442	186	161	161
query7	4924	551	286	286
query8	342	174	157	157
query9	8817	3919	3952	3919
query10	455	304	254	254
query11	5744	2167	1981	1981
query12	153	97	96	96
query13	1254	595	402	402
query14	6544	4554	4189	4189
query14_1	3962	4062	3979	3979
query15	206	195	178	178
query16	1003	451	426	426
query17	923	693	551	551
query18	2420	456	338	338
query19	204	185	143	143
query20	106	102	105	102
query21	217	132	115	115
query22	13194	12952	12748	12748
query23	15486	14709	14024	14024
query23_1	14087	14106	14080	14080
query24	7537	1701	1242	1242
query24_1	1247	1243	1213	1213
query25	539	424	358	358
query26	1268	297	171	171
query27	2703	536	334	334
query28	4552	1958	1954	1954
query29	1084	596	477	477
query30	322	240	205	205
query31	908	761	641	641
query32	155	99	102	99
query33	524	317	238	238
query34	1171	1137	611	611
query35	712	761	649	649
query36	812	820	709	709
query37	152	105	92	92
query38	1840	1764	1678	1678
query39	701	673	647	647
query39_1	636	666	628	628
query40	228	122	103	103
query41	73	69	67	67
query42	95	92	96	92
query43	336	343	302	302
query44	1327	694	700	694
query45	186	180	174	174
query46	1053	1158	681	681
query47	1516	1512	1407	1407
query48	379	428	289	289
query49	593	423	328	328
query50	937	384	242	242
query51	10422	10217	10054	10054
query52	84	86	71	71
query53	243	252	179	179
query54	251	194	188	188
query55	74	76	69	69
query56	240	218	225	218
query57	1430	1410	1368	1368
query58	232	208	211	208
query59	1989	2043	1807	1807
query60	269	247	224	224
query61	146	150	152	150
query62	413	319	266	266
query63	213	178	170	170
query64	2820	988	829	829
query65	3994	3955	3878	3878
query66	1817	417	303	303
query67	20075	20405	20205	20205
query68	3372	1462	880	880
query69	430	297	264	264
query70	905	886	862	862
query71	318	239	218	218
query72	2932	2518	2123	2123
query73	869	769	422	422
query74	4673	4514	4295	4295
query75	2309	2269	1942	1942
query76	2416	1073	692	692
query77	357	395	308	308
query78	9221	9140	8441	8441
query79	1385	1182	729	729
query80	667	471	354	354
query81	479	281	239	239
query82	616	162	140	140
query83	309	287	252	252
query84	311	144	115	115
query85	877	458	379	379
query86	348	239	232	232
query87	2020	1962	1813	1813
query88	3625	2713	2712	2712
query89	358	290	243	243
query90	1878	174	174	174
query91	168	159	125	125
query92	95	80	86	80
query93	1467	1407	889	889
query94	590	340	308	308
query95	680	352	412	352
query96	1048	750	328	328
query97	2429	2456	2325	2325
query98	201	192	184	184
query99	735	735	620	620
Total cold run time: 241470 ms
Total hot run time: 153333 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28283 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 7b9071b2fb424504e028aace739e53df733cf31d, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17701	4017	3934	3934
q2	2306	344	315	315
q3	10092	1413	813	813
q4	4681	475	346	346
q5	7511	851	551	551
q6	193	179	146	146
q7	764	817	602	602
q8	9365	1470	1566	1470
q9	5492	4235	4266	4235
q10	6653	1667	1369	1369
q11	458	279	246	246
q12	638	423	296	296
q13	18046	2655	2047	2047
q14	265	262	235	235
q15	q16	741	720	670	670
q17	1751	1220	1016	1016
q18	6461	5615	5546	5546
q19	1200	1293	1132	1132
q20	491	401	278	278
q21	5661	3088	2723	2723
q22	455	380	313	313
Total cold run time: 100925 ms
Total hot run time: 28283 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4888	5014	4706	4706
q2	805	618	584	584
q3	5325	5259	4685	4685
q4	2279	2375	1457	1457
q5	4626	4401	4710	4401
q6	242	185	137	137
q7	1852	1720	1509	1509
q8	2437	2117	2124	2117
q9	7414	7230	7259	7230
q10	4289	4242	3826	3826
q11	527	425	347	347
q12	711	734	507	507
q13	2370	2663	2026	2026
q14	270	290	251	251
q15	q16	659	681	613	613
q17	7416	6845	6680	6680
q18	11858	11032	11809	11032
q19	1160	1013	986	986
q20	2208	2201	1924	1924
q21	5543	4638	4752	4638
q22	530	483	411	411
Total cold run time: 67409 ms
Total hot run time: 60067 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 154033 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 7b9071b2fb424504e028aace739e53df733cf31d, data reload: false

query5	4307	616	466	466
query6	467	187	171	171
query7	4854	588	280	280
query8	335	176	165	165
query9	8790	4022	4019	4019
query10	449	319	260	260
query11	5811	2192	1975	1975
query12	163	97	94	94
query13	1240	585	409	409
query14	6510	4568	4249	4249
query14_1	4002	4014	4033	4014
query15	204	194	183	183
query16	974	409	445	409
query17	925	643	527	527
query18	2512	439	325	325
query19	198	176	134	134
query20	102	102	105	102
query21	217	140	116	116
query22	13106	12888	12865	12865
query23	15504	14445	13989	13989
query23_1	14156	14061	14113	14061
query24	7488	1716	1185	1185
query24_1	1220	1231	1235	1231
query25	513	427	341	341
query26	1264	312	161	161
query27	2741	577	330	330
query28	4574	1975	2019	1975
query29	1019	584	449	449
query30	312	233	201	201
query31	895	757	642	642
query32	143	107	99	99
query33	539	330	250	250
query34	1212	1165	635	635
query35	742	760	647	647
query36	798	799	696	696
query37	155	112	92	92
query38	1833	1785	1679	1679
query39	712	685	667	667
query39_1	633	660	659	659
query40	228	131	106	106
query41	75	75	69	69
query42	96	93	95	93
query43	347	358	303	303
query44	1418	709	695	695
query45	187	178	173	173
query46	1061	1197	713	713
query47	1506	1497	1415	1415
query48	400	426	306	306
query49	604	425	302	302
query50	960	346	252	252
query51	10482	10466	10287	10287
query52	86	87	75	75
query53	246	262	183	183
query54	280	220	199	199
query55	78	75	73	73
query56	238	245	230	230
query57	1535	1372	1445	1372
query58	243	219	220	219
query59	1988	2077	1813	1813
query60	297	257	235	235
query61	173	167	163	163
query62	405	323	270	270
query63	224	180	181	180
query64	2932	996	811	811
query65	4009	3990	3950	3950
query66	1816	413	303	303
query67	20097	20030	19898	19898
query68	3477	1467	946	946
query69	402	300	265	265
query70	951	871	877	871
query71	299	234	216	216
query72	2967	2514	2290	2290
query73	853	767	413	413
query74	4680	4475	4304	4304
query75	2323	2261	1916	1916
query76	2402	1126	747	747
query77	397	399	306	306
query78	8938	9074	8494	8494
query79	1229	1256	754	754
query80	578	443	356	356
query81	472	284	241	241
query82	669	170	126	126
query83	357	280	255	255
query84	321	143	115	115
query85	881	477	388	388
query86	331	233	228	228
query87	1992	1962	1839	1839
query88	3715	2745	2713	2713
query89	391	286	248	248
query90	1873	225	184	184
query91	173	157	128	128
query92	106	95	85	85
query93	1534	1537	891	891
query94	547	334	299	299
query95	664	362	423	362
query96	1135	737	352	352
query97	2492	2444	2313	2313
query98	200	186	189	186
query99	730	720	614	614
Total cold run time: 241750 ms
Total hot run time: 154033 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 24.28 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 7b9071b2fb424504e028aace739e53df733cf31d, data reload: false

query1	0.01	0.01	0.01
query2	0.10	0.06	0.05
query3	0.26	0.14	0.14
query4	1.62	0.14	0.15
query5	0.25	0.23	0.22
query6	1.15	0.94	0.94
query7	0.04	0.01	0.00
query8	0.07	0.05	0.04
query9	0.40	0.33	0.34
query10	0.55	0.57	0.56
query11	0.21	0.15	0.15
query12	0.19	0.15	0.14
query13	0.47	0.46	0.49
query14	0.97	0.94	0.97
query15	0.61	0.59	0.60
query16	0.34	0.32	0.32
query17	1.09	1.08	1.06
query18	0.23	0.20	0.21
query19	2.00	1.94	1.92
query20	0.02	0.02	0.01
query21	15.45	0.22	0.14
query22	4.84	0.06	0.05
query23	16.14	0.32	0.13
query24	3.03	0.43	0.57
query25	0.13	0.05	0.05
query26	0.74	0.22	0.15
query27	0.05	0.04	0.04
query28	3.54	0.79	0.37
query29	12.52	4.15	3.25
query30	0.30	0.18	0.17
query31	2.78	0.57	0.30
query32	3.22	0.59	0.48
query33	3.12	3.22	3.20
query34	15.46	3.98	3.30
query35	3.20	3.21	3.24
query36	0.55	0.45	0.42
query37	0.09	0.07	0.06
query38	0.05	0.05	0.04
query39	0.04	0.03	0.04
query40	0.18	0.15	0.14
query41	0.09	0.03	0.03
query42	0.04	0.03	0.03
query43	0.05	0.04	0.04
Total cold run time: 96.19 s
Total hot run time: 24.28 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 83.00% (210/253) 🎉
Increment coverage report
Complete coverage report

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants